package b.gate.to.juhe

import java.lang.{Byte => JByte}

import b.gate.pcks.CC填充
import b.gate.pcks.fix.{CC定长报文, CC定长报文域, O定长报文适配器}

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.{Future, Promise}
import scala.language.postfixOps
import scala.util.Random

/**
  * 虚核心是使用Tuxedo中间件造的, 渠道作为Tuxedo客户端, 用C/C++实现调用(dll), 再用JNA集成进来。<p>
  * 虚核心为长亮公司制造, 使用其专用的报文格式。
  *
  * 贲国称 于 16/8/22 创建。
  */
class C虚核心渠道 {
  val v报文长度域 = CC定长报文域(6, None, CC填充.O前补零)
  val v报文头定义 = CC定长报文(List[CC定长报文域](
    v报文长度域,
    CC定长报文域(6),
    CC定长报文域(2, Some("00"), CC填充.O不填充),
    CC定长报文域(2, Some("00"), CC填充.O不填充),
    CC定长报文域(10),
    CC定长报文域(8, Some("M0001")),
    CC定长报文域(20),
    CC定长报文域(10)
  ))
  val s虚核心服务名 = "LTTS"
  def f调用虚核心服务(v交易码: String, v输入: Any): List[Map[String, String]] = {
    val v报文体 = O长亮报文适配器.f组报文(v输入)
    val v报文头 = CC长亮报文头(v报文体.getBytes("GBK").length + v报文头定义.v报文长度 - v报文长度域.v域长度, v交易码 = v交易码)
    val v报文 = O定长报文适配器.f组报文[CC长亮报文头](v报文头, v报文头定义) + v报文体
    // log.debug(s"SEND to   [$s虚核心服务名] with [$v报文]")
    val v应答报文 = "" // LTTSo.call(v虚核心服务名, pointerToCString(v报文), 10L)
    // log.debug(s"RECV from [$s虚核心服务名] with [$v应答报文]")
    O长亮报文适配器.f拆开报文(v应答报文.drop(v报文头定义.v报文长度))
  }
  def v模拟调用(v交易码: String, v输入: Any): Any = {
    val code = if (v交易码 == "q1c") "200" else {
      val sleep = Math.abs(Random.nextInt % 2)
      assert(sleep > 0, "随机错误")
    }
    List[Map[String, String]](Map[String, String]("bal" -> "1000"))
  }
}
case class CC长亮报文头(v长度: Int, v编号: Option[String] = None, v类型: Option[String] = None, v消息Id: Option[String] = None, v交易码: String, v用户Id: Option[String] = None, v会话Id: Option[String] = None, v保留域: Option[String] = None)
